#ifndef __PCI__E__MSG__
#define __PCI__E__MSG__

#include <zmq.h>
#include <stdio.h>
#include <string.h>

#define FA_PCIE_REQ_ARR_SIZE    (128)

typedef enum
{
    FA_PCIE_SET        = 1,
    FA_PCIE_GET        = 2,
    FA_PCIE_READMEM    = 3,
    FA_PCIE_WRITEMEM   = 4,
}fa_pcie_op_e;

typedef struct fa_pcie_req
{
    fa_pcie_op_e        op;
    uint32_t            addr_offset;
    uint32_t            count;          //used for Get, for set is zero
    uint32_t            value[1];
}fa_pcie_req_t, fa_pcie_rep_t;

typedef struct fa_pcie_req_arr
{
    uint32_t            reqnum;
    fa_pcie_req_t       req[1];
}fa_pcie_req_arr_t;

typedef struct fa_pcie_rep_arr
{
    uint32_t            reqnum;
    fa_pcie_rep_t       rep[1];
}fa_pcie_rep_arr_t;

fa_pcie_req_arr_t* fa_pcie_apply_req_mem(uint32_t reqnum);
uint32_t fa_pcie_count_req_mem(uint32_t reqnum);
void fa_pcie_free_req_mem(fa_pcie_req_arr_t* req);
void fa_pcie_set_reg2(fa_pcie_req_arr_t* arr, uint32_t reg, uint32_t value);
void fa_pcie_get_reg2(fa_pcie_req_arr_t* arr, uint32_t reg, uint32_t* value);
void fa_pcie_handle_msg(void* fd, zmq_msg_t* fromaddr, void* data, uint32_t size);

#endif